<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // // 数组拍平的意思：不管有多少个数组都按照顺序把数字或其他内容排列在一个数组内。
        // flat([[1, 2], 3, [4, 5, [6, 7, [8, 9, [10, 11]]]]])
        // // [1,2,3,4,5,6,7,8,9,10,11]



        Array.prototype.concat.apply([], [1, 2, [3, 4], 5]); // 外层带中括号
        console.log([].concat(1, 2, [3, 4], 5));  // 外层不带中括号，每个数组元素直接逗号隔开


        // // 上述两个结果都相同，为[1, 2, 3, 4, 5]，如果数组里有一个数组是可以“拍平”的
        // // 如果嵌套两层数组则不能拍平，比如[1, 2, [3, 4,[10,20]], 5]




        function flat(arr) {
            // 验证 arr 中，还有没有深层数组


            // some() 方法用于检测数组中的元素是否满足指定条件（函数提供）。
            // some() 方法会依次执行数组的每个元素：如果有一个元素满足条件，则表达式返回true , 剩余的元素不会再执行检测。
            const isDeep = arr.some(item => item instanceof Array)
            if (isDeep) {
                const res = Array.prototype.concat.apply([], arr);
                return flat(res);
            }
            // 已经是flatern 
            return arr;


        }
        flat([1, 2, [3, 4, [10, 20]], 5]);//[1, 2, 3, 4, 10, 20, 5]
    </script>
</body>

</html>